##¿Qué es R? ¿Qué es Rstudio?
[R](https://es.wikipedia.org/wiki/R_(lenguaje_de_programaci%C3%B3n) es un software libre especializado en análisis estadítisco y visualización de datos. [Rstudio] es la interfaz que nos permite usar el lenguaje por detrás que es R.
#Para conocer más sobre los creadores de R:
contributors()
###¿Qué significa que sea software libre? Software libre se refiere a la libertad de los usuarios para ejecutar, copiar, distribuir, estudiar, cambiar y mejorar el software. Según GNU La libertad no refiere sólo a la gratuidad, sino más bien a la libertad de manipular y controlar el software.
###¿Por qué R y no otros lenguajes? ¿Cuál es la diferencia con otros lenguajes?
No hay un lenguaje mejor que otro. Hay lenguajes que nos resulta más fáciles que otros. Y con cualquier lenguaje se puede llegar a un resultado similar.
PERO, lo que tiene R a diferencia de otros lenguajes de programación: * COMUNIDAD de gente maravillosa que no tiene problema en contestarte ninguna duda. * Lo que si tiene R es un enfoque estadístico y de visualizaciones muy bueno que lo diferencian de otros lenguajes como Python.
knitr::include_graphics('https://github.com/Guadag12/R4RRII/raw/master/Clase%201/images/comparativa.jpg')
###Otras ventajas de usar R: * R-eproducibilidad en el análisis
Automatización de procesos
Nuevas posibilidades de trabajo colaborativo
Podemos hacer cosas que “a mano” eran inviables (por lentas, tediosas, o simplemente imposibles)
Acelerar y simplificar la limpieza y análisis de los datos libera tiempo para las cosas más gratificantes y/o de mayor impacto: tomar decisiones, evaluar resultados, hacerse nuevas preguntas
Una vez instalado abrimos Rstudio y nos vamos a encontrar con algo así:
knitr::include_graphics("https://github.com/Guadag12/R4RRII/raw/master/Clase%201/images/rstudio_session_4pane_layout.png")
* Source: En este panel vas a escribir/editar/ver los R script y los datasets. * Console/Terminal: Acá es donde se ejecutan los comandos redactados en el editor (Source). * Environment/History: En este panel Rstudio te muestra qué datasets y qué objetos (variables) tenes creadas en la memoria. La solapa “History” contiene el historial de los comandos ejecutados en R. * Files/Plots/Packages/Help: Este es un panel multiproposito que devuelve información solicitada. En “Files” vos podes navegar en tu escritorio y seleccionar archivos que desees. En “Plots” te va a mostrar los gráficos que realices, y si son interactivos van a aparecer en “Viewer”. En “Packages” podes ver cuáles son los paquetes instalados o disponibles. Por último en “Help” vas a poder consultar dudas sobre funciones o paquetes.
Dentro de la consola o del editor de texto podemos escribir nuestros códigos / algoritmos. En este sentido un algoritmo -no es más ni menos- que una serie de instrucciones, como una receta de cocina:
#1
1 + 1
## [1] 2
(2 * 2) - 1
## [1] 3
12^2
## [1] 144
sqrt(144)
## [1] 12
Una variable es un nombre que denota una dirección de memoria en la que se almacena un valor. De esa dirección es posible la lectura y/o modificación del valor almacenado.
knitr::include_graphics('https://github.com/Guadag12/R4RRII/raw/master/Clase%201/images/variables.png')
VARIABLE = EXPRESIÓN
En R no se usa tanto el signo “=”, sino que se usa la flecha “<-” para denotar asignacion.
#mi variable "x" tiene el valor 1
x <- 1
x
## [1] 1
#mi variable "y" tiene el valor 2
y <- 2
y
## [1] 2
#si genero una nueva variable "z" que sea la suma de mi variable "x" e "y" su valor va a ser igual a la suma de esas variables
z <- x + y
z
## [1] 3
#OJO con el nombre de las variables! Porque puedo pisarlas variables y pierdo el valor original
y <- 4
z <- x + y
z
## [1] 5
Asi como puedo asignar números también puedo asignar letras, palabras, combinaciones de caracteres:
H <- "Hello World"
H
## [1] "Hello World"
#A esta cadena le puedo preguntar cuántos valores tiene adentro:
length(H)
## [1] 1
#Y esos valores pueden cambiar:
H <- c("Hello", "World")
length(H)
## [1] 2
###Hagamos nuestro primer proyecto en R!:
Al programar necesitamos tener nuestros trabajos compartimentados y bien organizados. En ese sentido, necesitamos dividir nuestros trabajos en diferentes proyectos. A cada proyecto le asignaremos una carpeta en donde podremos tener nuestros archivos, scripts, notas, resultados.
###Generemos un proyecto para las clases:
knitr::include_graphics("https://github.com/Guadag12/R4RRII/blob/master/Clase%201/images/proyectos.png")
> Proyect(None) > New Project > New directory > Nombre del proyecto: “Clases de R” > Directorio: “D:/Guada/Clases/Clases_R_Eze/Clase 1/” > Create Project
##EMPECEMOS A TRABAJAR EN R!:
###¿Que son los Paquetes y las librerías?
R viene con algunas funciones básicas incluídas, pero puede ser expandido con paquetes. Cada paquete es una colección de funciones diseñadas para atender una tarea específica. Por ejemplo, hay paquetes para trabajo visualización geoespacial, análisis psicométricos, mineria de datos, interacción con servicios de internet y muchas otras cosas más.
Estos paquetes se encuentran alojados en CRAN (“The Comprehensive R Archive Network”). así que pasan por un control riguroso antes de estar disponibles para su uso generalizado.
Una de las cosas maravillosas que tiene R -a diferencia de otros lenguajes- es la documentación de sus paquetes. Siendo que por documentación entendemos una guía de convenciones y buenas prácticas para utilizar un conjunto de funciones ya redactadas.
Cuando haces esto, R importa las funciones contenidas en el paquete al entorno de trabajo actual.
#Podemos cargar los paquetes necesarios así:
install.packages("sf")
## Installing package into 'C:/Users/Usuario/Documents/R/win-library/3.6'
## (as 'lib' is unspecified)
## package 'sf' successfully unpacked and MD5 sums checked
## Warning: cannot remove prior installation of package 'sf'
## Warning in file.copy(savedcopy, lib, recursive = TRUE): problema al copiar C:
## \Users\Usuario\Documents\R\win-library\3.6\00LOCK\sf\libs\x64\sf.dll a C:
## \Users\Usuario\Documents\R\win-library\3.6\sf\libs\x64\sf.dll: Permission denied
## Warning: restored 'sf'
##
## The downloaded binary packages are in
## C:\Users\Usuario\AppData\Local\Temp\Rtmpoj0dBZ\downloaded_packages
install.packages("tidyverse")
## Installing package into 'C:/Users/Usuario/Documents/R/win-library/3.6'
## (as 'lib' is unspecified)
## package 'tidyverse' successfully unpacked and MD5 sums checked
##
## The downloaded binary packages are in
## C:\Users\Usuario\AppData\Local\Temp\Rtmpoj0dBZ\downloaded_packages
install.packages("ggplot2")
## Installing package into 'C:/Users/Usuario/Documents/R/win-library/3.6'
## (as 'lib' is unspecified)
## package 'ggplot2' successfully unpacked and MD5 sums checked
##
## The downloaded binary packages are in
## C:\Users\Usuario\AppData\Local\Temp\Rtmpoj0dBZ\downloaded_packages
install.packages("ggridges")
## Installing package into 'C:/Users/Usuario/Documents/R/win-library/3.6'
## (as 'lib' is unspecified)
## package 'ggridges' successfully unpacked and MD5 sums checked
##
## The downloaded binary packages are in
## C:\Users\Usuario\AppData\Local\Temp\Rtmpoj0dBZ\downloaded_packages
install.packages("plotly")
## Installing package into 'C:/Users/Usuario/Documents/R/win-library/3.6'
## (as 'lib' is unspecified)
## package 'plotly' successfully unpacked and MD5 sums checked
##
## The downloaded binary packages are in
## C:\Users\Usuario\AppData\Local\Temp\Rtmpoj0dBZ\downloaded_packages
install.packages("viridis")
## Installing package into 'C:/Users/Usuario/Documents/R/win-library/3.6'
## (as 'lib' is unspecified)
## package 'viridis' successfully unpacked and MD5 sums checked
##
## The downloaded binary packages are in
## C:\Users\Usuario\AppData\Local\Temp\Rtmpoj0dBZ\downloaded_packages
install.packages("leaflet")
## Installing package into 'C:/Users/Usuario/Documents/R/win-library/3.6'
## (as 'lib' is unspecified)
## package 'leaflet' successfully unpacked and MD5 sums checked
##
## The downloaded binary packages are in
## C:\Users\Usuario\AppData\Local\Temp\Rtmpoj0dBZ\downloaded_packages
Es importante que tengas en mente que debes hacer una llamada a library() cada que inicies una sesión en R. Aunque hayas importado las funciones de un paquete con anterioridad, las sesiones de R se inician “limpias”, sólo con los objetos y funciones de base.
Este comportamiento es para evitar problemas de compatibilidad y para propiciar buenas prácticas de colaboración.
Si importamos paquetes automáticamente y usamos sus funciones sin indicar de donde provienen, al compartir nuestro código con otras personas, estas no tendrán la información completa para entender qué estamos haciendo. R, al pedirnos que cada sesión indiquemos qué estamos importando, nos obliga a ser explícito con todo lo que estamos haciendo. Es un poco latoso, pero te acostumbras a ello.
library(sf)
## Warning: package 'sf' was built under R version 3.6.2
## Linking to GEOS 3.6.1, GDAL 2.2.3, PROJ 4.9.3
library(tidyverse)
## Warning: package 'tidyverse' was built under R version 3.6.2
## -- Attaching packages --------------------------------------------------------------------------------- tidyverse 1.3.0 --
## <U+2713> ggplot2 3.2.1 <U+2713> purrr 0.3.3
## <U+2713> tibble 2.1.3 <U+2713> dplyr 0.8.3
## <U+2713> tidyr 1.0.0 <U+2713> stringr 1.4.0
## <U+2713> readr 1.3.1 <U+2713> forcats 0.4.0
## Warning: package 'ggplot2' was built under R version 3.6.2
## Warning: package 'tibble' was built under R version 3.6.2
## Warning: package 'tidyr' was built under R version 3.6.2
## Warning: package 'readr' was built under R version 3.6.2
## Warning: package 'purrr' was built under R version 3.6.2
## Warning: package 'dplyr' was built under R version 3.6.2
## Warning: package 'stringr' was built under R version 3.6.2
## Warning: package 'forcats' was built under R version 3.6.2
## -- Conflicts ------------------------------------------------------------------------------------ tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag() masks stats::lag()
library(ggplot2)
library(ggridges)
## Warning: package 'ggridges' was built under R version 3.6.2
library(plotly)
## Warning: package 'plotly' was built under R version 3.6.2
##
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
##
## last_plot
## The following object is masked from 'package:stats':
##
## filter
## The following object is masked from 'package:graphics':
##
## layout
library(viridis)
## Warning: package 'viridis' was built under R version 3.6.2
## Loading required package: viridisLite
## Warning: package 'viridisLite' was built under R version 3.6.2
library(leaflet)
## Warning: package 'leaflet' was built under R version 3.6.2
Hoy vamos a trabajar con un dataset del Banco Mundial sobre Porcentaje del PBI destinado a defensa para más de 160 países.
Nosotros vamos a trabajar con archivos CSV, pero a R se le pueden cargar todo tipo de archivos (txt, excels, words, pdf, SPSS, SAS, Stata, json, geojson, etc).
Los csv (“Comma Separated Values”, .csv) son los archivos separados por comas. Este es un tipo de archivo comunmente usado para compartir datos, además de ser un formato libre - no privativo como excel, word o pdf -, sumado a que pesan significativamente menos y hace más rápido y cómodo el intercambio de información.
Para cargar nuestro archivo, debemos usar la función read.csv():
data <- read.csv("https://github.com/Guadag12/R4RRII/raw/master/Clase%201/presupuesto_defensa.csv")
Una vez que tenemos el archivo cargado podemos empezar a trabajar. En general, estos archivos se busca que esten en formato tidy.
En principio, vamos a revisar información básica sobre nuestra data. La función head() nos permite ver las primeras 6 filas de nuestro :
head(data)
## X Country_name Code Year Mean_PBI Continent Sub_Continent Country PBI_USD
## 1 1 Afghanistan AFG 1970 1.629606 Asia Southern Asia Afghanistan NA
## 2 2 Afghanistan AFG 1973 1.868910 Asia Southern Asia Afghanistan NA
## 3 3 Afghanistan AFG 1974 1.610825 Asia Southern Asia Afghanistan NA
## 4 4 Afghanistan AFG 1975 1.722066 Asia Southern Asia Afghanistan NA
## 5 5 Afghanistan AFG 1976 2.046087 Asia Southern Asia Afghanistan NA
## 6 6 Afghanistan AFG 1977 2.011475 Asia Southern Asia Afghanistan NA
Si queremos ver medidas de resumen como frecuencias, media, mediana, cuartiles y rango muestrales sobre nuestros datos, podemos usar la función summary, que es muy útil para tener una primera aproximación a nuestra data.
summary(data)
## X Country_name Code Year
## Min. : 1 Argentina : 58 ARG : 58 Min. :1960
## 1st Qu.:1721 Australia : 58 AUS : 58 1st Qu.:1980
## Median :3442 Austria : 58 AUT : 58 Median :1994
## Mean :3442 Belgium : 58 BEL : 58 Mean :1992
## 3rd Qu.:5162 Brazil : 58 BFA : 58 3rd Qu.:2006
## Max. :6882 Burkina Faso: 58 BRA : 58 Max. :2017
## (Other) :6534 (Other):6534
## Mean_PBI Continent Sub_Continent
## Min. : 0.000 Africa :2141 Eastern Africa : 695
## 1st Qu.: 1.217 Americas:1253 Western Africa : 678
## Median : 1.963 Asia :1664 Western Asia : 617
## Mean : 2.784 Europe :1620 South America : 605
## 3rd Qu.: 3.240 Oceania : 204 Northern Europe : 481
## Max. :117.350 South-Eastern Asia: 440
## (Other) :3366
## Country PBI_USD
## Argentina : 58 Min. :-2.591e+10
## Australia : 58 1st Qu.: 3.187e+07
## Austria : 58 Median : 2.307e+08
## Belgium : 58 Mean : 3.859e+08
## Brazil : 58 3rd Qu.: 5.391e+08
## Burkina Faso: 58 Max. : 3.007e+10
## (Other) :6534 NA's :439
Una vez que tengamos una noción inicial de cómo funciona y qué tipo de información contiene nuestro data frame, podemos empezar a hacernos preguntas más atinadas. Por ejemplo, ¿cuál es el promedio por país del porcente de PBI dedicado por década?
##Manipulación de datos
En este sentido, y como sabemos, R comenzó como un programa para matemáticos y estadísticos, y eso nos permite hacer operaciones más o menos complejas. En este caso, vamos a empezar con algo simple usando la librería tidyverse: vamos a generar un nuevo dataset llamado data_agrupada y que va a contener las variables agrupadas por las columnas “Year_group” (década correspondiente) y “Country_name” (nombre del país) con la funcion group_by(). Además vamos a generar una nueva columna llamada “Mean_decade_group” (decade) con la funcion mutate(). Esta nueva columna va a tener el promedio para la década correspondiente. Por otro lado, vamos a decirle a R que columnas queremos que nos muestre en este nuevo dataset con la funcion select()
data_agrupada <- data %>% group_by(Year, Country_name, Continent, Sub_Continent) %>% summarise(Mean_year_group = mean(Mean_PBI)) %>% select(Country_name, Year, Mean_year_group, Continent, Sub_Continent)
Y ahora, vamos a usar la función tail() para saber cómo nos queda nuestro data frame. Esta función tail() logra lo mismo que head() pero en vez de mostrarnos las primeras 6 observaciones, nos muestra las últimas 6.
tail(data_agrupada)
## # A tibble: 6 x 5
## # Groups: Year, Country_name, Continent [6]
## Country_name Year Mean_year_group Continent Sub_Continent
## <fct> <int> <dbl> <fct> <fct>
## 1 United States 2017 3.15 Americas Northern America
## 2 Uruguay 2017 2.05 Americas South America
## 3 Venezuela 2017 0.488 Americas South America
## 4 Vietnam 2017 2.29 Asia South-Eastern Asia
## 5 Zambia 2017 1.34 Africa Eastern Africa
## 6 Zimbabwe 2017 1.97 Africa Eastern Africa
¿Qué pasa si queremos obtener información sobre un subgrupo en particular? Por ejemplo, si queremos saber los porcentajes de PBI destinado por los diferentes países de América desde 2010. Para filtrar en R, usamos la funcióN filter().
data_sudamerica <- data_agrupada %>%
filter(Sub_Continent == "South America")
##Visualización de datos ¿Y si queremos graficar la distribución del porcentaje de PBI destinado a defensa?… podemos hacer un RIDGELINE!
ggplot(data_sudamerica, aes(x = Mean_year_group, y = Country_name, fill = Country_name)) +
geom_density_ridges() +
theme_ridges() +
theme(legend.position = "Center") +
labs(title ="Distribución del % de PBI destinado a Defensa", x = "% destinado", y = "Países") +
scale_fill_viridis(discrete = TRUE) +
scale_color_viridis(discrete=TRUE)
## Picking joint bandwidth of 0.4
También podemos jugar con los datos y hacer gráficos interactivo!
Cómo podemos saber cómo fue el comportamiento de nuestros países vecinos y de la Argentina en cuanto a la distribución del porcentaje destinado a defensa del 69 en adelante?
data_arg <- data %>%
filter(Country_name == "Argentina")
data_bra <- data %>%
filter(Country_name == "Brazil")
data_bol <- data %>%
filter(Country_name == "Bolivia")
data_ch <- data %>%
filter(Country_name == "Chile")
data_par <- data %>%
filter(Country_name == "Paraguay")
data_uru <- data %>%
filter(Country_name == "Uruguay")
p <- plot_ly(
#argentina
type = "scatter",
x = data_arg$Year,
y = data_arg$Mean_PBI,
name = 'ARGENTINA',
mode = "lines",
line = list(
color = '#17BECF'
)) %>%
#brasil
add_trace(
type = "scatter",
x = data_bra$Year,
y = data_bra$Mean_PBI,
name = 'BRASIL',
mode = "lines",
line = list(
color = '#188324'
)) %>%
#bolivia
add_trace(
type = "scatter",
x = data_bol$Year,
y = data_bol$Mean_PBI,
name = 'BOLIVIA',
mode = "lines",
line = list(
color = '#EEFB6B'
)) %>%
#chile
add_trace(
type = "scatter",
x = data_ch$Year,
y = data_ch$Mean_PBI,
name = 'CHILE',
mode = "lines",
line = list(
color = '#2D00C4'
)) %>%
#paraguay
add_trace(
type = "scatter",
x = data_par$Year,
y = data_par$Mean_PBI,
name = 'PARAGUAY',
mode = "lines",
line = list(
color = '#C41E1E'
)) %>%
#uruguay
add_trace(
type = "scatter",
x = data_uru$Year,
y = data_uru$Mean_PBI,
name = 'URUGUAY',
mode = "lines",
line = list(
color = '#1F7CB9'
)) %>%
layout(
title = "Evolución del presupuesto de Defensa para Argentina y sus vecinos",
xaxis = list(
type = 'date',
tickformat = "%Y"
))
p
##Estadística con R Otra de las cosas que permite hacer R es generar análisis estadísticos a partir de grandes bases de datos. Por ejemplo, ¿qué pasa si queremos conocer si hay una relación entre el aumento o la disminución del PBI y el porcentaje que los países le dedican a su defensa?
cor(data$PBI_USD, data$Mean_PBI, use = "complete.obs")
## [1] 0.02590881
¿Y en el caso de que queramos graficarla con una regresión lineal?
p3 <- ggplot(data, aes(x=PBI_USD, y=Mean_PBI)) +
geom_point() +
geom_smooth(method=lm , color="#238A8DFF", fill="#95D840FF", se=TRUE) +
theme_classic() +
coord_cartesian(ylim = c(0,35))
p3
## Warning: Removed 439 rows containing non-finite values (stat_smooth).
## Warning: Removed 439 rows containing missing values (geom_point).
##Mapeando con R! De la misma manera que trajimos un csv, vamos a aprender a trabajar con formatos de georeferenciación. El geojson es uno de ellos. Traigamoslo!
mapa_paises <- st_read("https://datahub.io/core/geo-countries/r/countries.geojson")
## Reading layer `countries' from data source `https://datahub.io/core/geo-countries/r/countries.geojson' using driver `GeoJSON'
## Simple feature collection with 255 features and 2 fields
## geometry type: MULTIPOLYGON
## dimension: XY
## bbox: xmin: -180 ymin: -90 xmax: 180 ymax: 83.6341
## epsg (SRID): 4326
## proj4string: +proj=longlat +datum=WGS84 +no_defs
head(mapa_paises)
## Simple feature collection with 6 features and 2 fields
## geometry type: MULTIPOLYGON
## dimension: XY
## bbox: xmin: -70.06241 ymin: -18.0314 xmax: 74.89231 ymax: 60.48078
## epsg (SRID): 4326
## proj4string: +proj=longlat +datum=WGS84 +no_defs
## ADMIN ISO_A3 geometry
## 1 Aruba ABW MULTIPOLYGON (((-69.99694 1...
## 2 Afghanistan AFG MULTIPOLYGON (((71.0498 38....
## 3 Angola AGO MULTIPOLYGON (((11.73752 -1...
## 4 Anguilla AIA MULTIPOLYGON (((-63.03767 1...
## 5 Albania ALB MULTIPOLYGON (((19.74777 42...
## 6 Aland ALA MULTIPOLYGON (((20.92018 59...
Una de las ventajas de trabajar con R es que podemos trabajar no sólo con más de dos datasets al mismo tiempo, sino que podemos unirlos y generar uno nuevo que contenga ambos datasets… usando la función join().
names(mapa_paises)[2] <- "Code" #Cambiamos el nombre de la columna "ISO-A3" a "Code" para poder hacer el join
data_map <- inner_join( mapa_paises, data, by = "Code")
## Warning: Column `Code` joining factors with different levels, coercing to
## character vector
Y ahora si, ya podemos hacer un mapa de, por ejemplo, el porcentaje destinado a defensa para cada uno de los países!!
data_map_17 <- data_map %>% filter(Year == "2017") #filtramos el año 2017
ggplot() +
geom_sf(data = data_map_17, aes(fill = Mean_PBI), color = NA) +
scale_fill_viridis_c() +
labs(title = "Promedio Presupuesto de Defensa",
subtitle = "Durante 2017",
fill = "Mean_PBI")
De la misma manera, podemos hacer un mapa interactivo para conocer un poco más de información detallada para cada país:
#generamos la paleta de colores
mypalette <- colorNumeric( palette="viridis", domain=data_map_17$Mean_PBI, na.color="transparent")
mypalette(c(45,43))
## Warning in mypalette(c(45, 43)): Some values were outside the color scale and
## will be treated as NA
## [1] "transparent" "transparent"
#le decimos a R qué información queremos que nos dé en el mapa
mytext <- paste(
"País: ", data_map_17$Country_name,"<br/>",
"Porcentaje_PBI: ", round(data_map_17$Mean_PBI, 2),
sep="") %>%
lapply(htmltools::HTML)
#armamos el mapa
m <- leaflet(data_map_17) %>%
addTiles() %>%
setView( lat=10, lng=0 , zoom=2) %>%
addPolygons( fillColor = ~mypalette(Mean_PBI), stroke=FALSE, label = mytext, smoothFactor = 0.7 )
m